package practica1.ui.tablaPoblacion;

import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableColumnModel;


/**
 * Componente que extiend de JTable e implementa un modelo de la población
 * para representar los datos
 * @author Miguel González - Miguel
 */
public class TablaPoblacion extends JTable {
    
    private ModeloPoblacionTabla modeloPoblacionTabla;
    private TablaCellEditorTextField editor;
    
    /**
     * Constructor del objeto
     * @param modeloTabla Modelo de la tabla
     */
    public TablaPoblacion(ModeloPoblacionTabla modeloTabla) {
        super();
        
        this.modeloPoblacionTabla = modeloTabla;
        
        init();
    }
    
    /**
     * Inicializa la tabla
     */
    private void init() {
        //Creamos el cell editor de tipo TextField
        editor = new TablaCellEditorTextField();
        
        //Establecemos la tabla en el modelo
        setModeloTabla(modeloPoblacionTabla);
    }
    
    /**
     * Listens for cells that has been edited. When a cell has been edited, this
     * function will run.
     */
    @Override
    public void editingStopped(ChangeEvent e) {
        String valor = (String)editor.getCellEditorValue();
        int row = editor.getRow();
        int column = editor.getColumn();
        
        //Actualizamos el modelo de la tabla
        modeloPoblacionTabla.setValueAt(valor, row, column);
        
        //Le decimos al JTable que pare de editar
        super.editingStopped(e);
    }
    
    /**
     * Devuelve el modelo de la tabla
     * @return ModeloPoblacionTabla
     */
    public ModeloPoblacionTabla getModeloTabla() {
        return modeloPoblacionTabla;
    }
    
    /**
     * Establece un nuevo modelo de la tabla
     * @param ModeloPoblacionTabla
     */
    public void setModeloTabla(ModeloPoblacionTabla modeloTabla) {
        this.modeloPoblacionTabla = modeloTabla;
        setModel(modeloTabla);
        
        //Al cambiar el modelo de la tabla es necesario volver a especificar
        //Los editores de las tablas
        especificarCellEditor();
        
        //Repintamos la tabla
        repaint();
    }
    
    /**
     * Especifica los cellEditor que tendrán cada columna
     */
    private void especificarCellEditor() {
        TableColumnModel tablaColumnModel = getColumnModel();

        tablaColumnModel.getColumn(1).setCellEditor(editor);
        tablaColumnModel.getColumn(2).setCellEditor(editor);
        tablaColumnModel.getColumn(3).setCellEditor(editor);
        tablaColumnModel.getColumn(4).setCellEditor(editor);
    }
}
